package 设计模式.一单例模式.snippet6;

/**
 * 懒汉式 双重检查 (推荐)
 * 优缺点说明:
 * 1) Double-Check概念 是多线程开发中常使用到的，如代码虫所示，我们进行了两
 * 次if (singleton == null)检查，这样就可以保证线程安全了。
 * 2)这样，实例化代码只用执行-一次，后面再次访问时，判断if (singleton == nul),
 * 直接return实例化对象，也避免的反复进行方法同步.
 * 3)线程安全;延迟加载;效率较高
 * 4)结论:在实际开发中，推荐使用这种单例设计模式
 */
public class SingletonTest06 {
    public static void main(String[] args) {
        //测试
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.printf("instance1与instance2是否相等:%s%n", instance1 == instance2);
        System.out.println(instance1.hashCode());
        System.out.println(instance2.hashCode());
    }
}

//懒汉式 线程安全，同步代码块，双重检查(推荐使用)
class Singleton {
    private static volatile Singleton INSTANCE;

    private Singleton() {
    }

    //提供一个静态得共有方法，加入同步处理的代码(添加synchronized关键字)，解决线程安全问题
    //即懒汉式
    public static Singleton getInstance() {
        if (INSTANCE == null) { //第一重检查
            synchronized (Singleton.class) {
                if (INSTANCE == null) { //第二重检查
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}